#include <iostream>
#include <memory>

class OrderState; 								// 前向声明

// Context（上下文）类：订单
class Order {
    std::unique_ptr<OrderState> state; 			// 使用智能指针管理状态对象

public:
    // 构造函数：接收一个初始状态对象的智能指针
    Order(std::unique_ptr<OrderState> initState) : state(std::move(initState)) {}

    // 设置新的状态
    void setState(std::unique_ptr<OrderState> newState) {
        state = std::move(newState);
    }

    // 处理请求的方法
    void handleRequest();
};

// 抽象状态类
class OrderState {
public:
    // 处理请求的纯虚函数，每个具体状态都需要实现它
    virtual void handle(Order& order) = 0;
};
// 具体状态类：已发货
class Shipped : public OrderState {
public:
    void handle(Order& order) override {
        // 处理已发货的订单
        std::cout << "订单已发货。关闭订单。" << std::endl;
    }
};


// 具体状态类：已支付
class Paid : public OrderState {
public:
    void handle(Order& order) override {
        // 处理已支付的订单
        std::cout << "订单已支付。准备发货。" << std::endl;
        // 切换到已发货状态
        order.setState(std::make_unique<Shipped>());
    }
};


// 处理订单的方法
void Order::handleRequest() {
    state->handle(*this);
}

// 使用状态模式的主函数
int main() {
    // 创建订单对象，并初始化为已支付状态
    Order order(std::make_unique<Paid>());
    // 处理订单请求：将状态从已支付切换到已发货
    order.handleRequest();
    // 处理订单请求：执行已发货状态的行为，即关闭订单
    order.handleRequest();
    return 0;
}